package Interfaz;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;

import javax.swing.ComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

import models.Accesorios;
import models.Empleados;
import models.Pedidos;
import models.Proveedores;
import models.Roles;

import org.hibernate.Session;
import org.hibernate.Transaction;

import connection.HibernateUtil;
/**
 * 
 * @author jorgetoo
 * Clase principal donde creo todos los componentes que contendra mi frame
 *
 */
public class PedidoWindow extends JFrame{


	private static final long serialVersionUID = -8736027577865992322L;
	
	Empleados empleado;
	Pedidos pedidos;
	Proveedores proveedor;
	Accesorios accesorio;
	
	Session DAO;
	Transaction tx;
	
	JPanel panel;
	
	JLabel actionBar;
	JLabel marcoUser;
	JLabel nombreUsuario;
	JLabel logoSmall;
	
	JScrollPane scroll;
	
	JButton find;
	
	JTextField findText;
	
	String[] cols = { "Cantidad","Proveedor","Accesorios", "Pedido por:" };
	
	JTable table;
	JTableHeader header;
	String filtro;

	
	JButton deleteBtn = new JButton();
	JButton nuevoBtn = new JButton();
	JButton saveBtn = new JButton();
	JButton cleanBtn = new JButton();
	
	Boolean nuevo = true;
	int idSeleccionado;
	
	List<Accesorios> accesorioObj;
	List<Pedidos> pedido1;
	List<Proveedores> proveedorObj;
	List<Roles> rolesObj;
	JComboBox rolList;
	JLabel savelbl = new JLabel("Guardar");
	JLabel cleanlbl = new JLabel("Limpiar");
	JLabel cantidadLbl = new JLabel("Cantidad");
	JLabel proveedorLbl = new JLabel("Proveedor");
	JLabel accesorioLbl = new JLabel("Accesorio");
	
	JTextField cantidadText = new JTextField();
	JComboBox proveedorList;
	JComboBox accesorioList;
	
	/**
	 * Constructor al que le paso el parametro empleado me inicializo la tabla y el scrol para que se cree en el frame
	 * Abrimos la sesion dao y llamo a los metodos
	 * @param empleado
	 */
	public PedidoWindow(Empleados empleado) {
		
		table = new JTable();
		scroll = new JScrollPane(table);
		filtro = "";
		this.empleado = empleado;
		DAO = HibernateUtil.configureSessionFactory().getCurrentSession();
		tx = DAO.beginTransaction();
		Buscar("");
		populateComboBox();
		populateComboBox1();
		populateComboBox2();
		initJFrameComponents();
		addActionListeners();
	}
	
	/**
	 * Este metodo inicializa todos los componentes creados en la clase principal 
	 */
	public void initJFrameComponents(){
		// Instanciar declaraciones
		panel = new JPanel();
		actionBar = new JLabel();
		marcoUser = new JLabel();
		logoSmall = new JLabel(new ImageIcon(getClass().getResource(
				"raw/logo_small.jpg")));
		
		nombreUsuario = new JLabel("Gestion de Pedidos");
		find = new JButton();
		findText = new JTextField();
		
		// Instanciar declaraciones END//
		// Asignar propiedades
		actionBar.setBackground(Color.BLACK);
		actionBar.setForeground(Color.BLACK);
		actionBar.setBounds(0, 0, 800, 32);
		actionBar.setOpaque(true);

		marcoUser.setBackground(new Color(0xEEEEEE));
		marcoUser.setForeground(new Color(0xEEEEEE));
		marcoUser.setBounds(32, 10, 98, 98);
		marcoUser.setOpaque(true);

		logoSmall.setBounds(36, 14, 90, 90);

		nombreUsuario.setBounds(150, 3, 256, 25);
		nombreUsuario.setForeground(Color.WHITE);
		nombreUsuario.setFont(new Font("Serif", Font.BOLD, 18));

		find.setBounds(768, 0, 32, 32);
		find.setOpaque(true);
		find.setBackground(Color.GRAY);
		find.setForeground(Color.WHITE);
		find.setBorder(null);
		find.setIcon(new ImageIcon(getClass().getResource("raw/find.png")));
		findText.setBounds(668, 0, 100, 32);
		findText.setBorder(null);
		findText.setForeground(Color.WHITE);
		findText.setBackground(Color.GRAY);
		
		cantidadLbl.setBounds(500,190,100,25);
		proveedorLbl.setBounds(500,220,100,25);
		accesorioLbl.setBounds(500,250,100,25);
		
		cantidadText.setBounds(570,195,150,18);
		proveedorList.setBounds(570,225,150,18);
		accesorioList.setBounds(570,255,150,18);
		
		saveBtn.setBackground(Color.WHITE);
		saveBtn.setBorder(null);
		saveBtn.setForeground(Color.WHITE);
		saveBtn.setIcon(new ImageIcon(getClass().getResource("raw/guardar.png")));
		saveBtn.setBounds(570, 300, 48, 48);
		savelbl.setBounds(570,330,48,48);
		
		cleanBtn.setBackground(Color.WHITE);
		cleanBtn.setBorder(null);
		cleanBtn.setForeground(Color.WHITE);
		cleanBtn.setIcon(new ImageIcon(getClass().getResource("raw/limpiar.png")));
		cleanBtn.setBounds(640, 300, 48, 48);
		cleanlbl.setBounds(640,330,48,48);
		
		// Agragarlas a la interfaz.
		this.add(savelbl);
		this.add(cleanlbl);
		this.add(logoSmall);
		this.add(findText);
		this.add(find);
		this.add(nombreUsuario);
		this.add(marcoUser);
		this.add(actionBar);
		this.add(cantidadLbl);
		this.add(proveedorLbl);
		this.add(accesorioLbl);
		this.add(cantidadText);
		this.add(proveedorList);
		this.add(accesorioList);
		this.add(saveBtn);
		this.add(cleanBtn);
		this.add(scroll);
		// Agragarlas a la interfaz END//
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setBounds(((d.width / 2) - 400), ((d.height / 2) - 300), 800, 600);
				panel.setBackground(Color.WHITE);
		this.setTitle("MyBolos ERP  ->  " + empleado.getNombre() + " "
						+ empleado.getApellido1());
		this.add(panel);
		this.setBackground(Color.WHITE);
		this.setVisible(true);
		this.setResizable(false);
		
		
	}
	
	/**
	 * En este metodo le pasamos 3 su funcionalidad es crear nuevos pedidos 
	 * @param n
	 * @param a
	 * @param p
	 */
	public void crearPedido(int n, int a, int p){
		Pedidos pedido = new Pedidos();
		pedido.setCantidad(n);
		pedido.setAccesorios(accesorioObj.get(a));
		pedido.setProveedores(proveedorObj.get(p));
		pedido.setEmpleados(empleado);
		
		try{
		DAO.saveOrUpdate(pedido);
		System.out.println("correcto");
		tx.commit();
		}catch(Exception e){
			System.out.print("Error!" + e.toString());
		}
		
		
	}
	
	
	/**
	 * En ese metodo se encarga de mantener los botones a la espera para cuando sean presionados hacer su funcion
	 * Botones guardar, limpiar y buscar.
	 */
	public void addActionListeners(){
			
		saveBtn.addActionListener(new ActionListener() {
				
			public void actionPerformed(ActionEvent arg0) {
						
				int cantidad = Integer.parseInt(cantidadText.getText());
				int accesorio = accesorioList.getSelectedIndex();
				int proveedor = proveedorList.getSelectedIndex();
					
				crearPedido(cantidad, accesorio, proveedor);
				
				Buscar(filtro);
					
			}
		});
		
		cleanBtn.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent arg0) {
				
				
				cantidadText.setText("");
				accesorioList.setSelectedIndex(0);
				proveedorList.setSelectedIndex(0);
				nuevo = true;
			}
		});
		
		findText.addKeyListener(new KeyListener() {
			
			public void keyTyped(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
				
			}
			
			public void keyReleased(KeyEvent arg0) {
				// TODO Auto-generated method stub
				filtro = findText.getText();
				Buscar(filtro);
				
			}
			
			public void keyPressed(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}
		});

	}
	
	
	/**
	 * Este metodo se usa para el find del boton de arriba para buscar dentro de la tabla el valor que escribes
	 * Ademas de rellenar los datos de la tabla y comprobar que si no esta vacia se crea si esta vacia no se crea la tabla
	 * @param filter
	 */
	public void Buscar(String filter){
		
		DAO = HibernateUtil.configureSessionFactory().getCurrentSession();
		tx = DAO.beginTransaction();
		
		table.removeAll();
		
		if(filter.equals("")){
			pedido1 = DAO.createQuery("FROM Pedidos").list();
			
		}else{
			pedido1 = DAO.createQuery("FROM Pedidos WHERE candidad LIKE '%"+filter+"%'").list();
		}
		//DAO.close();
		System.out.println(pedido1.size());
		if(pedido1!=null){
		if(pedido1.size()!=0){
			
			
		String[][] accesoriosMatriz = new String[pedido1.size()][4];
		for (int x = 0; x < pedido1.size(); x++) {
		
			accesoriosMatriz[x][0] = "" + pedido1.get(x).getCantidad();
			accesoriosMatriz[x][1] = pedido1.get(x).getAccesorios().getNombre();
			accesoriosMatriz[x][2] = pedido1.get(x).getProveedores().getNombreEmpresa();
			accesoriosMatriz[x][3] = pedido1.get(x).getEmpleados().getNombre();
		}
	
		
		DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
		tcr.setHorizontalAlignment(SwingConstants.CENTER);
		
		
		DefaultTableModel model = new DefaultTableModel(accesoriosMatriz,cols);
		header = table.getTableHeader();
		header.setBackground(Color.GRAY);
		header.setForeground(Color.WHITE);
		table.setBackground(Color.WHITE);
		table.setBorder(null);
		table.setModel(model);
		scroll.setBackground(Color.WHITE);
		scroll.setForeground(Color.WHITE);
		scroll.setBorder(null);
		scroll.setBounds(160, 200, 330, 150);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		
		}
	}
	}
	
	
	/**
	 * Este metodo se encarga de mostrar los datos de la tabla llamando al valor correspondiente 
	 * Le pasamos el valor id que sera el idSeleccionado que hemos creado arriba.
	 * @param id
	 */
	public void populateFastView(int id) {
		
		idSeleccionado = id;
		Pedidos pedidoTemp = pedido1.get(id);
				
		cantidadText.setText(Integer.toString(pedidoTemp.getCantidad()));
		accesorioList.setName(pedidoTemp.getAccesorios().getNombre());
		proveedorList.setName(pedidoTemp.getProveedores().getNombreEmpresa());
	
	}
	
	/**
	 * Este metodo recorre la tabla proveedores entera para sacar los datos y guarrdarmelos en una lista donde luego los llamare
	 */
	public void populateComboBox1() {
		proveedorObj = DAO.createQuery("FROM Proveedores").list();
		String[] proveedor = new String[proveedorObj.size()];
		for (int i = 0; i < proveedorObj.size(); i++) {
			proveedor[i] = proveedorObj.get(i).getNombreEmpresa();
		}
		proveedorList = new JComboBox(proveedor);
	}
	
	/**
	 * Este metodo recorre la tabla Accesorios entera para sacar los datos y guarrdarmelos en una lista donde luego los llamare
	 */
	public void populateComboBox2() {
		accesorioObj = DAO.createQuery("FROM Accesorios").list();
		String[] accesorio = new String[accesorioObj.size()];
		for (int i = 0; i < accesorioObj.size(); i++) {
			accesorio[i] = accesorioObj.get(i).getNombre();
		}
		accesorioList = new JComboBox(accesorio);
	}
	
	/**
	 * Este metodo recorre la tabla Roles entera para sacar los datos y guarrdarmelos en una lista donde luego los llamare
	 */
	public void populateComboBox(){
		rolesObj = DAO.createQuery("FROM Roles").list();
		String[] rolesTxt = new String[rolesObj.size()];
		for (int i = 0; i < rolesObj.size(); i++) {
			rolesTxt[i]=rolesObj.get(i).getNombre();
		}
		rolList = new JComboBox(rolesTxt);
	}
}
